package dletc.Lamda;

/*
* 【Lambda是对函数接口的一种实现，相当于重写抽象方法,返回值是接口的对象】
* 推导Lambda
*  Lambda表达式是为了更简洁的编程，一步步从 内部类 -> 局部内部类(方法中就是局部) -> 匿名内部类 -> Lambda
*  使用Lambda前提条件 函数接口：接口中有且只有一个抽象方法
*  Lambda是从匿名内部类推导出来的
* */
public class StudyLambda {
    //3.静态内部类
    static class like2 implements Iliek{
        @Override
        public void lambda() {
            System.out.println("use Lambda2");
        }
    }

    class like3 implements Iliek{
        @Override
        public void lambda() {
            System.out.println("内部类实现接口");
        }
    }

    public static void main(String[] args) {
        //正常情况 实现接口 创建实现类instance
        Iliek like = new like();
        like.lambda();

        like = new like2();
        like.lambda();
        //4.局部内部类
        class like3 implements Iliek{
            @Override
            public void lambda() {
                System.out.println("use Lambda3");
            }
        }
        like = new like3();
        like.lambda();

        //5.匿名内部类
        like = new Iliek() {
            @Override
            public void lambda() {
                System.out.println("use Lambda4");
            }
        };
        like.lambda();

        //6.Lambda表达式 是一步步推演出来的 截取了匿名内部类中的 方法部分，因为只有一个方法所以方法名省略
        //            () {
        //                System.out.println("use Lambda4");
        //            }
        like = () -> {
            System.out.println("usr Lambda5");
        };
        like.lambda();
    }
}

//1.定义函数接口
interface Iliek{
    public abstract void lambda();
}

//2.实现该接口
class like implements Iliek{
    @Override
    public void lambda() {
        System.out.println("use Lambda1");
    }
}